import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.NumberUtil;

import java.util.concurrent.atomic.AtomicLong;
  
public class UniqueValueGenerator {  
    private final AtomicLong sequence = new AtomicLong(0);  
    private final int maxSequence;  
    private final java.util.Random random;  
  
    public UniqueValueGenerator(int maxSequence) {  
        this.maxSequence = maxSequence;  
        this.random = new java.util.Random();  
    }  
  
    public String generate(int productType) {  
        // 确保productType在有效范围内  
        if (productType < 0 || productType > 7) {  
            throw new IllegalArgumentException("Product type must be between 0 and 7");  
        }  
  
        // 更新序列号  
        long nextSequence = sequence.getAndUpdate(curr -> {  
            if (curr >= maxSequence) {  
                return 0;  
            } else {  
                return curr + 1;  
            }  
        });

        // 生成24位随机数（这里用32位表示，然后截取前24位）  
        long randomBits = 999999999999L & 0xFFFFFFFFFFL; // 保留低32位中的前24位
        System.out.println(randomBits);
  
        // 将序列号转换为13位二进制字符串（左补0）  
        String sequenceBits = String.format("%013d", nextSequence).substring(String.format("%013d", nextSequence).length() - 13);  
  
        // 商品类型转换为3位二进制字符串（左补0）  
        String productTypeBits = String.format("%03d", productType);  
  
        // 拼接字符串  
        String fullBits = Long.toBinaryString(randomBits) + sequenceBits + productTypeBits;  
  
        // 注意：这里fullBits可能超过40位，因为randomBits取了32位。我们需要截取前40位  
        fullBits = fullBits.substring(fullBits.length() - 40);  
  
        // 如果需要，可以将二进制字符串转换为十进制（但可能超出long范围）  
        // long decimalValue = Long.parseLong(fullBits, 2); // 注意：这可能会抛出NumberFormatException  
  
        // 返回二进制字符串或根据需要处理  
        return fullBits;  
    }
  
    public static void main(String[] args) {  
        UniqueValueGenerator generator = new UniqueValueGenerator(4095); // 可以改为8191或其他值  
        String uniqueValue = generator.generate(3);  
        System.out.println(uniqueValue); // 输出类似于"1010101..."（40位二进制）
        System.out.println(Integer.parseInt(uniqueValue, 2));

    }  
}